﻿using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Xml;

namespace Angle.Krill.Utils
{
    /// <summary>
    /// 反射帮助类
    /// </summary>
    public sealed class ReflectionHelper
    {
        /// <summary>
        /// 动态调用方法，如无返回值则返回NULL
        /// </summary>
        /// <param name="objReflection">反射对象</param>
        /// <param name="methodName">方法名称</param>
        /// <returns></returns>
        public static object Instance(string dllPath, string clsFullName)
        {
            if (string.IsNullOrEmpty(clsFullName))
            {
                return null;
            }
            // 加载程序集，创建程序集里面的 命名空间.类型名 实例
            object obj = Assembly.LoadFrom(dllPath).CreateInstance(clsFullName);

            return obj;
        }
        /// <summary>
        /// 动态调用方法，如无返回值则返回NULL
        /// </summary>
        /// <param name="objReflection">反射对象</param>
        /// <param name="methodName">方法名称</param>
        /// <returns></returns>
        public static object Instance(Type type, List<AdditionalParamInfo> paramInfos)
        {
            List<Type> paramTypes = new List<Type>();
            List<object> paramValue = new List<object>();
            foreach (var p in paramInfos)
            {
                paramTypes.Add(p.ValueType);
                paramValue.Add(p.Value);
            }
            // 获取构造函数的参数类型
            Type[] constructorTypes = paramTypes.ToArray();

            // 使用反射获取构造函数
            ConstructorInfo constructor = type.GetConstructor(constructorTypes);

            // 创建实例
            object[] constructorParameters = paramValue.ToArray();
            object instance = constructor.Invoke(constructorParameters);

            return instance;
        }
    }
}
